package com.common.base.utils

import android.content.Context
import android.content.pm.ApplicationInfo
import com.common.base.app.extras.otherwise
import com.common.base.app.extras.yes

/**
 * app的环境控制
 */
object DebugUtils {
    const val SP_DEBUG_EnvModel = "DebugUtils_EnvModel"

    /**
     * 是否是内部使用的一些东西，发布到外界需要设置为false
     */
    private var isEnvLog = false

    /**
     * 是否可手动切换环境（测试专用）
     */
    private var isEnvShow = false

    /**
     * 当前的开发环境模式，默认是线上
     */
    private var currentDevModel: Int = EnvModel.RELEASE.value

    /**
     * @return 是否可以打印日志
     */
    fun isEnvLog(): Boolean {
        return isEnvLog
    }

    /**
     * 设置是否可以打印日志
     */
    fun setEnvLog(isEnvLog: Boolean) {
        this.isEnvLog = isEnvLog
    }

    /**
     * @return 调试模式，测试或者开发
     */
    fun isDebugModel(): Boolean {
        return isDevModel() || isTestModel()
    }

    fun getAppVersion(): String {
        return isReleaseModel().yes { "release" }.otherwise { "debug" }
    }

    /**
     * @return 开发模式
     */
    fun isDevModel(): Boolean {
        return (getCurrentEnvModel() == EnvModel.DEV.value)
    }

    /**
     * @return 开发模式
     */
    fun isDevModel2(): Boolean {
        return getCurrentEnvModel() == EnvModel.DEV2.value
    }


    fun isTestModel(): Boolean {
        return getCurrentEnvModel() == EnvModel.TEST.value
    }

    /**
     * @return 正式环境
     */
    fun isReleaseModel(): Boolean {
        return getCurrentEnvModel() == EnvModel.RELEASE.value
    }

    /**
     * 设置当前的开发环境
     */
    fun setEnvShow(isShowEnv: Boolean) {
        this.isEnvShow = isShowEnv
    }

    /**
     * 是否可以切换app环境
     */
    fun isEnvShow(): Boolean {
        return isEnvShow
    }

    /**
     * 获取当前的模式
     */
    fun getCurrentEnvModel(): Int {
        val model = SpUtilsManagement.getInt(SP_DEBUG_EnvModel + "_${AppUtils.getVersionName()}")
        return if (model == 0)
            currentDevModel
        else {
            model
        }
    }

    /**
     * 设置当前的模式
     * 供测试人员手动切换app的环境
     */
    fun setCurrentEnvModel(model: Int) {
        SpUtilsManagement.putInt(SP_DEBUG_EnvModel + "_${AppUtils.getVersionName()}", model)
    }

    fun setCurrentEnvModel(model: EnvModel) {
        val index = when (model) {
            EnvModel.DEV2 -> 4
            EnvModel.DEV -> 3
            EnvModel.TEST -> 2
            else -> 1
        }
        SpUtilsManagement.putInt(SP_DEBUG_EnvModel + "_${AppUtils.getVersionName()}", index)
    }

    fun isApkInDebug(context: Context): Boolean {
        try {
            val info: ApplicationInfo = context.applicationInfo
            val result: Int = info.flags or ApplicationInfo.FLAG_DEBUGGABLE
            return result != 0
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return false
    }
}